/*
 * @Author: Yang qiuyou wangyi168359476@163.com
 * @Date: 2024-07-26 11:15:02
 * @LastEditors: wanghuan wanghuan@sgsimulation.com
 * @LastEditTime: 2024-09-01 14:08:26
 * @FilePath: \SGFEM\DataStructure\FEM\Constraint\include\RBARData.h
 * @Description: @ RBAR 混合主从刚性梁单元
 *
 */

#pragma once
#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Real.h"
#include "DataStructure/Input/Element/ElementBase.h"
#include "DataStructure/Input/Solver/DOFDirections.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
/** @ RBAR 混合主从刚性梁单元
 *
 * 刚性梁单元， 单元的主自由度可以位于不同的节点上。六个主自由度必须能够精确描述单元的刚体运动。
 */
struct DECLSPEC RBARData : public ElementBase
{
    SG::DataStructure::Common::Id   m_node1 = 0, m_node2 = 0;            ///< 节点编号
    SG::DataStructure::Common::I64  m_masterDof1 = 0, m_masterDof2 = 0;  ///< 节点上定义的独立自由度集合
    SG::DataStructure::Common::I64  m_slaveDof1 = 0, m_slaveDof2 = 0;    ///< 被约束的自由度集合
    SG::DataStructure::Common::Real m_alpha          = 0.0;              ///< 热膨胀系数
    SG::DataStructure::Common::Real m_refTemperature = 0.0;              ///< 参考温度
    SG::DataStructure::Common::Id   m_domainId       = 0;

    /**
     * @brief 获取主自由度集1
     *
     * 返回主自由度集1的引用。
     *
     * @return 主自由度集1的引用
     */
    SG::DataStructure::FEM::DofSet GetMasterDof1 () const;
    void                           SetMasterDof1 (const SG::DataStructure::FEM::DofSet& dofs);

    /**
     * @brief 获取主自由度集合2
     *
     * 返回一个主自由度集合2的引用。
     *
     * @return 主自由度集合2的引用
     */
    SG::DataStructure::FEM::DofSet GetMasterDof2 () const;
    void                           SetMasterDof2 (const SG::DataStructure::FEM::DofSet& dofs);

    /**
     * @brief 获取从属自由度集合1
     *
     * 返回从属自由度集合1的实例。
     *
     * @return 从属自由度集合1的实例
     */
    SG::DataStructure::FEM::DofSet GetSlaveDof1 () const;
    void                           SetSlaveDof1 (const SG::DataStructure::FEM::DofSet& dofs);

    /**
     * @brief 获取从节点自由度集合2
     *
     * 从内部数据结构中获取从节点的自由度集合2，并返回该集合。
     *
     * @return 从节点的自由度集合2
     *
     */
    SG::DataStructure::FEM::DofSet GetSlaveDof2 () const;
    void                           SetSlaveDof2 (const SG::DataStructure::FEM::DofSet& dofs);
};

/// @brief 判断两个RBARData是否相等
/// @param a
/// @param b
/// @return
DECLSPEC bool operator== (const RBARData& a, const RBARData& b);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE